// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// async function async2() {
//   console.log('async2');
// }
// console.log("script start");
// setTimeout(function () {
//   console.log("settimeout");
// }, 0);
// async1();
// new Promise(function (resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function () {
//   console.log("promise2");
// });
// console.log('script end');

// async function async1() {
//   console.log('async1 start');
//   await async2();
//   //更改如下：
//   setTimeout(function() {
//     console.log('setTimeout1');
//   }, 0)
// }
// async function async2() {
//   //更改如下：
//   setTimeout(function() {
//     console.log('setTimeout2');
//   }, 0)
// }
// console.log('script start');
// setTimeout(function() {
//   console.log('setTimeout3');
// }, 100)
// async1();
// new Promise(function(resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function() {
//   console.log("promise2");
// });
// console.log('script end');


// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// async function async2() {
//   console.log('async2');
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// Promise.resolve().then(() => {
//   console.log('promise1')
// })
// Promise.resolve().then(() => {
//   console.log('promise2')
//   Promise.resolve().then(() => {
//     console.log('promise3')
//     Promise.resolve().then(() => {
//       console.log('promise4')
//     })
//   })
// })
// Promise.resolve().then(() => {
//   console.log('promise5')
// })
// console.log('script end');


// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// async function async2() {
//   console.log('async2');
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// Promise.resolve().then(() => {
//   console.log('promise5')
// })
// new Promise((resolve) => {
//   console.log('promise2')
//   resolve();
// }).then(() => {
//   Promise.resolve().then(() => {
//     console.log('promise2.then')
//   })
// }).then(() => {
//   Promise.resolve().then(() => {
//     console.log('promise3')
//   })
// }).then(() => {
//   Promise.resolve().then(() => {
//     console.log('promise4')
//   })
// })
// Promise.resolve().then(() => {
//   console.log('promise1')
// }).then(() => {
//   console.log('promise6')
// })
// console.log('script end')


// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// async function async2() {
//   console.log('async2');
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// Promise.resolve().then(() => {
//   console.log('promise5')
// })
// new Promise((resolve) => {
//   console.log('promise2')
//   resolve();
// }).then(() => {
//   console.log('promise2.then')
// }).then(() => {
//   console.log('promise3')
// }).then(() => {
//   console.log('promise4')
// })
// Promise.resolve().then(() => {
//   console.log('promise1')
// }).then(() => {
//   console.log('promise6')
// })
// console.log('script end')


// console.log(1);
// setTimeout(() => {
//   console.log(2);
// }, 20)
// console.log(3);
// setTimeout(() => {
//   console.log(4);
// }, 0)
// console.log(5);
// setTimeout(() => {
//   console.log(6);
// }, 10)
// for (var i = 0; i < 99999999; i++) { }
// console.log(9);
// setTimeout(() => {
//   console.log(10);
// }, 10)
// console.log(7);
// setTimeout(() => {
//   console.log(8);
// }, 10)
// console.log(11);
// setTimeout(() => {
//   console.log(12);
// }, 0)


// // demo02
// console.log('golb1');

// setTimeout(function() {
//   console.log('timeout1');
//   process.nextTick(function() {
//     console.log('timeout1_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('timeout1_promise');
//     resolve();
//   }).then(function() {
//     console.log('timeout1_then')
//   })
// })

// setImmediate(function() {
//   console.log('immediate1');
//   process.nextTick(function() {
//     console.log('immediate1_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('immediate1_promise');
//     resolve();
//   }).then(function() {
//     console.log('immediate1_then')
//   })
// })

// process.nextTick(function() {
//   console.log('glob1_nextTick');
// })
// new Promise(function(resolve) {
//   console.log('glob1_promise');
//   resolve();
// }).then(function() {
//   console.log('glob1_then')
// })

// setTimeout(function() {
//   console.log('timeout2');
//   process.nextTick(function() {
//     console.log('timeout2_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('timeout2_promise');
//     resolve();
//   }).then(function() {
//     console.log('timeout2_then')
//   })
// })

// process.nextTick(function() {
//   console.log('glob2_nextTick');
// })
// new Promise(function(resolve) {
//   console.log('glob2_promise');
//   resolve();
// }).then(function() {
//   console.log('glob2_then')
// })

// setImmediate(function() {
//   console.log('immediate2');
//   process.nextTick(function() {
//     console.log('immediate2_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('immediate2_promise');
//     resolve();
//   }).then(function() {
//     console.log('immediate2_then')
//   })
// })


// console.log('1');

// setTimeout(function() {
//   console.log('2');
//   process.nextTick(function() {
//     console.log('3');
//   })
//   new Promise(function(resolve) {
//     console.log('4');
//     resolve();
//   }).then(function() {
//     console.log('5');
//   })
// })

// process.nextTick(function() {
//   console.log('6');
// })

// new Promise(function(resolve) {
//   console.log('7');
//   resolve();
// }).then(function() {
//   console.log('8');
// })

// setTimeout(function() {
//   console.log('9');
//   process.nextTick(function() {
//     console.log('10');
//   })
//   new Promise(function(resolve) {
//     console.log('11');
//     resolve();
//   }).then(function() {
//     console.log('12');
//   })
// })

// // demo02
// console.log('golb1');

// setTimeout(function() {
//   console.log('timeout1');
//   process.nextTick(function() {
//     console.log('timeout1_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('timeout1_promise');
//     resolve();
//   }).then(function() {
//     console.log('timeout1_then')
//   })
// },100)

// setImmediate(function() {
//   console.log('immediate1');
//   process.nextTick(function() {
//     console.log('immediate1_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('immediate1_promise');
//     resolve();
//   }).then(function() {
//     console.log('immediate1_then')
//   })
// })

// process.nextTick(function() {
//   console.log('glob1_nextTick');
// })
// new Promise(function(resolve) {
//   console.log('glob1_promise');
//   resolve();
// }).then(function() {
//   console.log('glob1_then')
// })

// setTimeout(function() {
//   console.log('timeout2');
//   process.nextTick(function() {
//     console.log('timeout2_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('timeout2_promise');
//     resolve();
//   }).then(function() {
//     console.log('timeout2_then')
//   })
// },10)

// process.nextTick(function() {
//   console.log('glob2_nextTick');
// })
// new Promise(function(resolve) {
//   console.log('glob2_promise');
//   resolve();
// }).then(function() {
//   console.log('glob2_then')
// })

// setImmediate(function() {
//   console.log('immediate2');
//   process.nextTick(function() {
//     console.log('immediate2_nextTick');
//   })
//   new Promise(function(resolve) {
//     console.log('immediate2_promise');
//     resolve();
//   }).then(function() {
//     console.log('immediate2_then')
//   })
// })

// async2里面不是promise对象
// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// async function async2() {
//   return console.log('async2');
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// new Promise(function(resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function() {
//   console.log("promise2");
// }).then(function() {
//   console.log("promise3");
// }).then(function() {
//   console.log("promise4");
// })
// console.log('script end');

// async + return  async1 end在promise3后面 下降两个时延
// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }

// async function async2() {
//   console.log('async2');
//   return new Promise(function(resolve, reject) {
//     resolve();
//     console.log('async2 promise');
//   }).then(() => {
//     console.log('async2 promise2');
//   }).then(() => {
//     console.log('async2 promise3');
//   })
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// new Promise(function(resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function() {
//   console.log("promise2");
// }).then(function() {
//   console.log("promise3");
// }).then(() => {
//   console.log("promise4");
// })
// console.log('script end');

// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// async function async2() {
//   console.log('async2');
//   await new Promise(function(resolve, reject) {
//     resolve();
//     console.log('async2 promise');
//   }).then(() => {
//     console.log('async2 promise2');
//   })
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// new Promise(function(resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function() {
//   console.log("promise2");
// }).then(function() {
//   console.log("promise3");
// }).then(() => {
//   console.log("promise4");
// })
// console.log('script end');

// 这个await后面的promise有then 和没then 都会根据链式调用顺序将await下面的代码变成微任务放入。
// async function async1() {
//   console.log("async1 start");
//   // await async2();
//   await new Promise(function(resolve, reject) {
//     resolve();
//     console.log('async2 promise');
//   }).then(() => {
//     console.log('async2 then');
//   })
//   console.log("async1 end");
// }

// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// new Promise(function(resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function() {
//   console.log("promise2");
// }).then(function() {
//   console.log("promise3");
// }).then(function() {
//   console.log("promise4");
// })
// console.log('script end');

// 普通函数+return
// async function async1() {
//   console.log("async1 start");
//   await async2();
//   console.log("async1 end");
// }
// function async2() {
//   console.log('async2');
//   return new Promise(function(resolve, reject) {
//     resolve();
//     console.log('async2 promise');
//   }).then(() => {
//     console.log('async2 then');
//   })
// }
// console.log("script start");
// setTimeout(function() {
//   console.log("settimeout");
// }, 0);
// async1();
// new Promise(function(resolve) {
//   console.log("promise1");
//   resolve();
// }).then(function() {
//   console.log("promise2");
// }).then(function() {
//   console.log("promise3");
// }).then(function() {
//   console.log("promise4");
// })
// console.log('script end');

// // async + 没有return 或者普通函数 + 没有return
// async function async1() {
//   console.log('async1 start');
//   await async2();
//   console.log('async1 end');
// }
// async function async2() {
//   //async2做出如下更改：
//   console.log('async2');
//   new Promise(function(resolve) {
//     console.log('async2 promise');
//     resolve();
//   }).then(function() {
//     console.log('async2 promise2');
//   }).then(() => {
//     console.log('async2 promise3');
//   })
// }
// console.log('script start');
// setTimeout(function() {
//   console.log('setTimeout');
// }, 0)
// async1();
// new Promise(function(resolve) {
//   console.log('promise1');
//   resolve();
// }).then(function() {
//   console.log('promise2');
// }).then(() => {
//   console.log('promise3')
// }).then(() => {
//   console.log('promise4')
// })
// console.log('script end');